#version 400 core

subroutine vec4 LightFunc(vec3);

subroutine (LightFunc) vec4 ambient(vec3 n) {
    return Materials.ambient;
}

subroutine (LightFunc) vec4 diffuse(vec3 n) {
    return Materials.diffuse * max(dot(normalize(n), LightVec.xyz), 0.0);
}

subroutine uniform LightFunc materialShader;

subroutine void Type1();
subroutine void Type2();
subroutine void Type3();

subroutine (Type1, Type2) void Func1() {}
subroutine (Type1, Type3) void Func2() {}

subroutine uniform Type1 func1;
subroutine uniform Type2 func2;
subroutine uniform Type3 func3;

void main() {

}
